﻿/**************************************************************************
创建日期:	2019/6/19
作	  者:	张存
邮 	  箱:	zhangcunliang@126.com
创建时间:
Copyright (c)  ZhCun.cn

描	述：  此脚本在所有项目中通用，不应该改变此方法来适应业务变化，其它业务变化的内容在 common.js 中修改
          此脚本应不包含执行类代码，执行类代码应放入common.js（ 导入jquery除外）
记	录：
    2020.7.2 body加密改为动态赋值（可修改）
    2020.7.7 同时加密请求时密钥错误的bug修复
***************************************************************************/

document.write("<script type='text/javascript' src='../js/jquery.min.js'></script>");

/**
 * 获取cookie
 * @param {string} c_name cookie 键名
 */
function getCookie(c_name) {
    if (!c_name || c_name.length == 0) return "";
    if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=")
        if (c_start != -1) {
            c_start = c_start + c_name.length + 1
            c_end = document.cookie.indexOf(";", c_start)
            if (c_end == -1) c_end = document.cookie.length
            return unescape(document.cookie.substring(c_start, c_end))
        }
    }
    return "";
}

/**
 * 设置cookie 
 * @param {string} name cookie名称
 * @param {string} value cookie值
 * @param {any} min cookie 距当前时间的有效分钟
 */
function setCookie(name, value, min) {
    //var Days = 30;
    var exp = new Date();
    //exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
    if (min && min > 0) {
        exp.setTime(exp.getTime() + min * 60 * 1000);
    } else {
        exp.setTime(exp.getTime() + 5 * 60 * 1000);
    }
    document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
}

/**
 * 删除指定的cookie
 * @param {string} name cookie名称
 */
function delCookie(name) {
    var exp = new Date();
    exp.setTime(exp.getTime() - 1);
    var cval = getCookie(name);
    if (cval != null)
        document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}
/**
 * 序列化form对象，返回json
 * @param {any} form对象选择参数
 */
function formSerializeJson(e) {
    var a = $(e).serializeArray();
    var o = {};
    $.each(a, function () {
        var value = this.value;
        var paths = this.name.split(".");
        var len = paths.length;
        var obj = o;
        $.each(paths, function (i, e) {
            if (i == len - 1) {
                if (obj[e]) {
                    if (!obj[e].push) {
                        obj[e] = [obj[e]];
                    }
                    obj[e].push(value || '');
                } else {
                    obj[e] = value || '';
                }
            } else {
                if (!obj[e]) {
                    obj[e] = {};
                }
            }
            obj = o[e];
        });
    });
    return o;
}

/**
 * 将url参数字符串，转换为json字符串，如:name=张三&age=18 转换为：{name:'张三',age:18}
 * 如果str是json字符串那么返回str
 * @param {string} str 要转换的字符
 */
function urlParamToJson(str) {
    //let str = "http://localhost:3000/index.html？phone=12345678901&pwd=123123";
    //let arr = urlParam.split("?")[1].split("&");   //先通过？分解得到？后面的所需字符串，再将其通过&分解开存放在数组里

    if (str.indexOf("{") != -1 && str.indexOf("}") != -1) {
        return str;
    }
    let arr = str.split("&");
    let obj = {};
    for (let i of arr) {
        //obj[i.split("=")[0]] = i.split("=")[1];  //对数组每项用=分解开，=前为对象属性名，=后为属性值
        obj[i.split("=")[0]] = decodeURI(i.split("=")[1]);
    }
    return JSON.stringify(obj);
}

/**
 * 指定元素进行浏览器全屏处理
 * @param {any} element
 */
function requestFullScreen(element) {
    var requestMethod = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullScreen;
    if (requestMethod) {
        requestMethod.call(element);
    } else if (typeof window.ActiveXObject !== "undefined") {
        var wscript = new ActiveXObject("WScript.Shell");
        if (wscript !== null) {
            wscript.SendKeys("{F11}");
        }
    }
}

/**
 * 日期格式化为字符串的扩展
 * @param {any} fmt 格式，yyyy-MM-dd HH:mm:ss
 * 用法： (new date()).format("yyyy-MM-dd");
 */
Date.prototype.format = function (fmt) { //author: meizz 
    var o = {
        "M+": this.getMonth() + 1, //月份 
        "d+": this.getDate(), //日 
        "h+": this.getHours(), //小时 
        "m+": this.getMinutes(), //分 
        "s+": this.getSeconds(), //秒 
        "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
        "S": this.getMilliseconds() //毫秒 
    };
    if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}

/**
 * 将指定时间对象增加指定值，返回新的时间对象
 * @param {string} type    增加值的类型: s(秒) m(分) h(时) d(天) w(周) M(月) y(年)
 * @param {int} value  增加值
 */
Date.prototype.add = function (type, value) {
    var sValue = this.getSeconds(),
        mValue = this.getMinutes(),
        hValue = this.getHours(),
        dValue = this.getDate(),
        MMValue = this.getMonth(),
        yValue = this.getFullYear();
    var r;
    if (type == "s") {
        sValue += value;
    } else if (type == "m") {
        mValue += value;
    } else if (type == "h") {
        hValue += value;
    } else if (type == "d") {
        dValue += value;
    } else if (type == "w") {
        dValue += value * 7;
    } else if (type == "M") {
        MMValue += value;
    } else if (type == "y") {
        yValue += value;
    }
    return new Date(yValue, MMValue, dValue, hValue, mValue, sValue);
}

/**
 * 产生随机数字符串，仅返回数字与字母
 * @param {boolean} randomFlag 是否任意长度，如果为true，则min与max有效，false：仅min有效
 * @param {any} min 任意长度最小位[固定位数]
 * @param {any} max 任意长度最大位
 */
function randomWord(randomFlag, min, max) {
    var str = "",
        range = min,
        arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

    // 随机产生
    if (randomFlag) {
        range = Math.round(Math.random() * (max - min)) + min;
        return range;
    }
    var pos;
    for (var i = 0; i < range; i++) {
        pos = Math.round(Math.random() * (arr.length - 1));
        str += arr[pos];
    }
    return str;
}

/**
 * 使用jquery 进行以json格式 进行post请求
 * @param {string} url 地址
 * @param {object} jsonData json对象
 * @param {Function} callBack 成功响应后的回调方法
 */
function jqJsonPost(url, jsonData, callBack) {
    var jsonStr = JSON.stringify(jsonData);
    $.ajax({
        url: url,
        type: "post",
        contentType: "application/json",
        data: jsonStr,
        //dataType: "json",
        success: function (data, textStatus, jqXHR) {
            callBack(data, textStatus, jqXHR);
        }
    });
}

/**
 * 设置jquery的ajax请求为加密请求
 * @param {string} rsa公钥
 * @param {object} jquery对象 如果为空，则使用$代替
 */
function setJqueryAjaxSetup(rsaPubKey, encryptHeaderName = null) {
    //let aesKey;
    var isEnRequest = checkLength(rsaPubKey, 1, 500);
    $.ajaxSetup({
        url: window.location.host,
        //processData: true,
        dataType: "json",
        contentType: "application/json",
        beforeSend: function (xhr, textState) {
            if (textState.type == "GET") return;
            textState.data = urlParamToJson(textState.data);
            if (isEnRequest) {
                try {
                    //console.log("加密请求数据：" + textState.data);
                    let aesKey = randomWord(false, 16);
                    this.AesKey = aesKey;
                    var rsa = new JSEncrypt();
                    rsa.setPublicKey(rsaPubKey);
                    var aesEncryptKey = rsa.encrypt(aesKey); //使用rsa加密的aes密钥
                    if (encryptHeaderName == null) {
                        encryptHeaderName = "BodyEncryptKey";
                    }
                    xhr.setRequestHeader(encryptHeaderName, aesEncryptKey);
                    textState.data = aesEncrypt(textState.data, aesKey, aesKey); //加密的内容赋值                    
                }
                catch (e) {
                    console.log("加密内容出错：");
                    console.log(arguments);
                    console.log(e);
                }
            }
        },
        dataFilter: function (data) {
            var result = data;
            try {
                if (isEnRequest) {
                    let aesKey = this.AesKey;
                    if (aesKey) {
                        result = aesDecrypt(result, aesKey, aesKey);
                    }
                }
            } catch (e) {
                console.log("解密内容出错：");
                console.log(arguments);
                console.log(e);
            } finally {
                return result;
            }
        },
        error: function (xhr, status, error) {
            if (xhr.status == 401) {
                //登录授权失败,刷新页面
                if (window.top) {
                    window.top.location.reload();
                } else {
                    window.location.reload();
                }
            } else if (xhr.status == 403) {
                alert("你没有这个权限");
            } else {
                //console.log(error);
            }
        }
    });
}

/**
 * 导入指定脚本 
 * @param {any} scriptName 脚本文件名及相对路径，如：js/zhcun.utils.js
 */
function importScript(scriptName) {
    document.write("<script type='text/javascript' src='" + scriptName + "'></script>");
}

/**
 * 检查字符串长度，是否在指定长度范围内
 * @param {string} str 校验的字符串
 * @param {int} minLen 校验的长度最小值
 * @param {int} maxLen 校验的长度最大值（为空默认为50）
 */
function checkLength(str, minLen, maxLen) {
    if (typeof str == "undefined" || str == null || str == "") {
        return false;
    } else {
        if (!maxLen) {
            maxLen = 50;
        }
        if (str.length >= minLen && str.length <= maxLen) return true;
        else return false;
    }
}

/**
 * 判断对象是否为非null\undefined
 * @param {any} obj
 */
function isNotNull(obj) {
    if (obj && obj != null) {
        return true;
    }
    return false;
}
/**
 * 设置session本地存储
 * @param {string} key
 * @param {any} obj json对象或字符串
 */
function setSessionStorage(key, obj) {
    if (typeof (obj) != 'string') {
        obj = JSON.stringify(obj);
    }
    sessionStorage.setItem(key, obj);
}
/**
 * 返回session本地存储
 * @param {string} key
 */
function getSessionStorage(key) {
    return sessionStorage.getItem(key);
}